#ifndef MATRIX_H
#define MATRIX_H

#include <iostream>
#include <vector>
#include <stdexcept>
#include <cstring>
#include <random>
#include <iomanip>

class Matrix {
private:
    int rows;
    int cols;
    float* data;
    bool ownsData; // 标记是否需要在析构函数中释放内存

public:
    // 构造函数
    Matrix(int rows, int cols);
    
    // 使用预分配的内存构造矩阵
    Matrix(int rows, int cols, float* externalData, bool takeOwnership = false);
    
    // 复制构造函数
    Matrix(const Matrix& other);
    
    // 移动构造函数
    Matrix(Matrix&& other) noexcept;
    
    // 赋值运算符
    Matrix& operator=(const Matrix& other);
    
    // 移动赋值运算符
    Matrix& operator=(Matrix&& other) noexcept;
    
    // 析构函数
    ~Matrix();
    
    // 随机初始化矩阵，值在[min, max]之间
    void randomInit(float min = 0.0f, float max = 1.0f);
    
    // 使用特定值初始化矩阵
    void fill(float value);
    
    // 获取矩阵元素 - const版本
    float get(int i, int j) const;
    
    // 设置矩阵元素
    void set(int i, int j, float value);
    
    // 获取行数
    int getRows() const { return rows; }
    
    // 获取列数
    int getCols() const { return cols; }
    
    // 获取数据指针
    float* getData() { return data; }
    const float* getData() const { return data; }
    
    // 检查两个矩阵是否近似相等
    bool isApproxEqual(const Matrix& other, float epsilon = 1e-5) const;
    
    // 打印矩阵
    void print(const std::string& name = "", std::ostream& os = std::cout, int precision = 4) const;

    // 随机初始化矩阵，生成-1.0到1.0之间的随机浮点数
    void randomize() {
        std::random_device rd;
        std::mt19937 gen(rd());
        std::uniform_real_distribution<float> dist(-1.0f, 1.0f);
        
        for (int i = 0; i < rows * cols; ++i) {
            data[i] = dist(gen);
        }
    }
};

#endif // MATRIX_H 